package com.springboot.file.util.easyexcel.exception;

import com.springboot.file.exception.BusinessException;
import lombok.Getter;
import java.util.Collections;
import java.util.List;

/**
 * Excel校验异常类
 */
@Getter
public class ExcelValidationException extends BusinessException {

    /**
     * 错误信息列表
     */
    private final List<String> errorMessages;

    /**
     * 出错的行号
     */
    private final int rowIndex;
    
    /**
     * Sheet名称
     */
    private final String sheetName;
    
    /**
     * Sheet索引
     */
    private final int sheetIndex;

    /**
     * 构造函数
     *
     * @param rowIndex 出错的行号
     * @param errorMessages 错误信息列表
     * @param sheetName Sheet名称
     * @param sheetIndex Sheet索引
     */
    public ExcelValidationException(int rowIndex, List<String> errorMessages, String sheetName, int sheetIndex) {
        // 创建包含详细信息的错误消息
        super(createDetailedErrorMessage(rowIndex, errorMessages, sheetName, sheetIndex));
        this.rowIndex = rowIndex;
        this.errorMessages = errorMessages;
        this.sheetName = sheetName;
        this.sheetIndex = sheetIndex;
    }

    /**
     * 构造函数
     *
     * @param rowIndex 出错的行号
     * @param errorMessage 错误信息
     * @param sheetName Sheet名称
     * @param sheetIndex Sheet索引
     */
    public ExcelValidationException(int rowIndex, String errorMessage, String sheetName, int sheetIndex) {
        // 使用创建包含详细信息的错误消息
        super(String.format("Sheet[%d:%s] 第%d行数据校验失败：%s", sheetIndex, sheetName, rowIndex, errorMessage));
        this.rowIndex = rowIndex;
        this.errorMessages = Collections.singletonList(errorMessage);
        this.sheetName = sheetName;
        this.sheetIndex = sheetIndex;
    }
    
    /**
     * 构造函数 (兼容旧代码)
     *
     * @param rowIndex 出错的行号
     * @param errorMessages 错误信息列表
     */
    public ExcelValidationException(int rowIndex, List<String> errorMessages) {
        // 创建包含行号的错误消息
        super(String.format("第%d行数据校验失败：%s", rowIndex, String.join("，", errorMessages)));
        this.rowIndex = rowIndex;
        this.errorMessages = errorMessages;
        this.sheetName = "未知";
        this.sheetIndex = -1;
    }

    /**
     * 构造函数 (兼容旧代码)
     *
     * @param rowIndex 出错的行号
     * @param errorMessage 错误信息
     */
    public ExcelValidationException(int rowIndex, String errorMessage) {
        // 创建包含行号的错误消息
        super(String.format("第%d行数据校验失败：%s", rowIndex, errorMessage));
        this.rowIndex = rowIndex;
        this.errorMessages = Collections.singletonList(errorMessage);
        this.sheetName = "未知";
        this.sheetIndex = -1;
    }
    
    /**
     * 创建详细的错误消息
     */
    private static String createDetailedErrorMessage(int rowIndex, List<String> errorMessages, String sheetName, int sheetIndex) {
        return String.format("Sheet[%d:%s] 第%d行数据校验失败：%s", 
                sheetIndex, sheetName, rowIndex, String.join("，", errorMessages));
    }
} 